Review:
Design Patterns, by Erich Gamma, et al.
Author: |
Erich Gamma |
Author: |
Richard Helm |
Author: |
Ralph Johnson |
Author: |
John Vlissides |
Publisher: |
Addison-Wesley |
Copyright: |
1995 |
Printing: |
September 1999 |
ISBN: |
0-201-63361-2 |
Format: |
Hardcover |
Pages: |
374 |
Design Patterns: Elements of Reusable Object-Oriented Software by
the so-called "Gang of Four" (Gamma, Helm, Johnson, and Vlissides) is one
of the best-known books ever written about software design, and one of the
most widely cited. The language introduced here, including the names of
specific design patterns, is still in widespread use in the software
field, particularly with object-oriented languages. I've had a copy for
years, on the grounds that it's one of those books one should have a copy
of, but only recently got around to reading it.
The goal of this book is to identify patterns of design that are widely
used, and widely useful, for designing object-oriented software. It's
specific to the object-oriented model; while some of the patterns could be
repurposed for writing OO-style programs in non-OO languages, they are
about inheritance, encapsulation, and data hiding and make deep use the
facilities of object-oriented design. The patterns are very general,
aiming for a description that's more general than any specific domain.
They're also high-level, describing techniques and methods for
constructing a software system, not algorithms. You couldn't encapsulate
the ideas here in a library and just use them; they're ideas about program
structure that could be applied to any program with the relevant problem.
With the benefit of seventeen years of hindsight, I think the primary
impact of this book has been on communication within the field. The ideas
in here are not new to this book. Every pattern in
Design Patterns
was already in use in the industry before it was published; the goal was
taxonomy, not innovation. One would not come to
Design Patterns to
learn how to program, although most introductory texts on object-oriented
programming now borrow much of the pattern terminology. Rather,
Design Patterns is as influential as it is because it introduced a
shared terminology and a rigor around that terminology, allowing writers
and programmers to put a name to specific program structures and thus talk
about them more clearly. This also allows one to take a step back and see
a particular structure in multiple programs, compare and contrast how it's
used, and draw some general conclusions about where it would be useful.
I have the feeling that the authors originally hoped the book would serve
as a toolbox, but I think it's instead become more of a dictionary. The
pattern names standardized here are widely used even by people who have
never read this book, but I doubt many people regularly turn to this book
for ideas for how to structure programs.
Design Patterns is divided into two parts: a general introduction
to and definition of a software pattern followed by a case study, and then
a catalog of patterns. The catalog is divided into creational patterns
(patterns for creating objects), structural patterns (patterns for
composing objects into larger structures), and behavioral patterns
(patterns for interactions between objects). Each pattern in turn follows
a very rigid presentation structure consisting of the pattern name and
high-level classification, its basic intent, other common names, a
scenario that motivates the pattern, comments on the applicability of the
pattern, the structure and classes or objects that make up the pattern,
how those participants collaborate, how the pattern achieves its goals,
comments on implementation issues, sample code, known uses of the pattern
in real-world software, and related patterns. As with a dictionary, the
authors go to great lengths to keep the structure, terminology, and
graphical representations uniform throughout, and the cross-referencing is
comprehensive (to the point of mild redundancy).
As for the patterns themselves, their success, both as terminology and as
useful design elements, varies. Some have become part of the core lexicon
of object-oriented programming (Factory Method, Builder, Singleton),
sometimes to the point of becoming syntactic elements in modern OO
languages (Iterator). These are terms that working programmers use daily.
Others aren't quite as widespread, but are immediately recognizable as
part of the core toolkit of object-oriented programming (Adapter,
Decorator, Proxy, Observer, Strategy, Template Method). In some cases,
the technique remains widespread, but the name hasn't caught on (Command,
for example, which will be immediately familiar but which I rarely hear
called by that name outside of specific uses inside UI toolkits due to
ambiguity of terms). Other patterns are abstract enough that it felt like
a bit of a reach to assign a name to them (Bridge, Composite, Facade), and
I don't think use of those names is common, but the entries are still
useful for definitional clarity and for comparing similar approaches with
different implications. Only one pattern (Interpreter) struck me as
insufficiently generic to warrant recording in a catalog of this type.
So far, so good, but the obvious question arises: if you've not already
read this book, should you read it? I think the answer to that is
debatable.
The largest problem with
Design Patterns is that it's old. It came
late enough in the development of object-oriented programming that it does
capture much of the foundation, but OO design has continued to change and
grow, and some patterns have either been developed subsequently or have
become far more important. For example, Model-View-Controller is
conspicuous by its absence, mentioned only in passing in the discussion of
the Observer pattern. Any pattern catalog written today would have an
extensive discussion. Similarly absent are Inversion of Control and Data
Access Object, which are much more central to the day-to-day world of the
modern programmer than, say, Memento or Visitor. One could easily go on:
Lazy Initialization, Mock Object, Null Object... everyone will have their
own list.
A related problem is that all the implementation examples are shown in
either C++ or Smalltalk (occasionally both). Those were probably the best
languages to use at the time, but it's doubtful a modern rewrite would
choose them. Smalltalk, in particular, I found nearly incomprehensible
for the uninitiated, to the point where I ignored the code and only read
the surrounding English description. C++ fares better, but
Design
Patterns occasionally drifts off into tedious discussions of how to work
around C++'s limitations in ways that are irrelevant to the pattern itself
and would not be necessary in, say, Java or Python. (This is ameliorated
by the fact that C++, unlike Smalltalk, is still in widespread use, so
those discussions remain moderately helpful for some readers.)
Design Patterns is not, therefore, a very good source for a working
knowledge of the most common patterns in use today. It has also become
somewhat obsolete via its own success: the concept of a design pattern has
become so popular that nearly all introductory texts include at least a
basic discussion of design patterns and an introduction to the most
notable and useful patterns. I think that's a more comfortable and more
efficient way to pick up the basics than reading through this book, which
is somewhat dense and which expects from the reader a reasonably good
working knowledge of object-oriented programming. And, once you have the
basics, MVC, DAO, and similar design patterns are probably more important
than the more subtle design patterns presented here.
That said, I think the rigor of description and the comparisons and
discussions here still have some value.
Design Patterns encourages
the reader to look at patterns from a higher-level perspective, to think
about meta-patterns such as the balance between data hiding and access, or
between structure designed for the present purpose and structure that's
adaptable to future needs. It's also mildly interesting from a historical
standpoint; one can see the inspiration for future language designers in
how problems are described here, and see how many of the implementation
issues and negative consequences have been corrected or simplified by
richer language designs.
Overall, I would hesitate to recommend buying this book today,
particularly at new textbook prices. But if you're a working
object-oriented software designer or programmer, I think it's worth
checking out from a library (and, thanks to its influence, any library
with a decent software design section will almost certainly have a copy).
Read the overall discussion, skim the catalog, and read the discussion of
the patterns that strike your interest. It may help provide some
additional structure and perspective to how you think about OO design.
Rating: 6 out of 10